package ThreadTest;


//================中断线程===================

//1、手动创建一个标志位来控制线程的终端：在其他线程中来控制这个标志位
//注意：此时需要这些线程共用同一个虚拟地址空间，才能保证标志位是同一个值
/*public class Demo9 {
    private static class MyRunnable implements Runnable {
        public volatile boolean isQuit = false;

        @Override
        public void run() {
            while (!isQuit) {
                System.out.println(Thread.currentThread().getName()
                        + ": 别管我，我忙着转账呢!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName()
                    + ": 啊！险些误了大事");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyRunnable target = new MyRunnable();
        Thread thread = new Thread(target, "李四");
        System.out.println(Thread.currentThread().getName()
                + ": 让李四开始转账。");
        thread.start();
        Thread.sleep(10 * 1000);
        System.out.println(Thread.currentThread().getName()
                + ": 老板来电话了，得赶紧通知李四对方是个骗子！");
        target.isQuit = true;
    }
}*/


//2、使用 thread 对象的 interrupted() 方法通知线程结束
public class ThreadInterrupt {
    private static class MyRunnable implements Runnable {
        @Override
        public void run() {
            // 两种方法均可以
            while (!Thread.interrupted()) {//这个方法判定的标志位是Thread的static成员(一个程序只能有一个标志位)   会清除中断标志
                //while(Thread.isinterrupted)   会清除中断标志
                //无脑使用 while (!Thread.currentThread().isInterrupted()) 判定的标志是Thread的普通成员，每个示例都有自己的标志  不会清除中断标志
                System.out.println(Thread.currentThread().getName() + ": 别管我，我忙着转账呢!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println(Thread.currentThread().getName() + ": 有内鬼，终止交易！");
                    //注意此处的 break！打印出异常日志后，如果不加break还是会继续该循环
                    break;
                }
            }
            System.out.println(Thread.currentThread().getName() + ": 啊！险些误了大事");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyRunnable target = new MyRunnable();
        Thread thread = new Thread(target, "李四");
        System.out.println(Thread.currentThread().getName() + ": 让李四开始转账。");
        thread.start();
        Thread.sleep(5 * 1000);
        System.out.println(Thread.currentThread().getName() + ": 老板来电话了，得赶紧通知李四对方是个骗子！");

        //注意：调用此方法会出现两种情况。
        //1、如果thread线程是就绪状态，就设置标志位为true
        //2、如果处在阻塞状态(sleep休眠)就会触发一个interruptException异常，从而导致线程从阻塞状态被唤醒，打印完异常日志后加上break终止循环
        thread.interrupt();
    }
}